# tuple「元组」定义语法为： (元素1, 元素2, ..., 元素n)
# 1. 小括号把所有元素绑在一起
# 2. 逗号将每个元素一一分开
# @.创建和访问一个元组

"""
1. 创建元组可以用小括号 ()，也可以什么都不用，为了可读性，建议还是用 ()。
2. 元组中只包含一个元素时，需要在元素后面添加逗号，否则括号会被当作运算符使用：
"""

t1 = (1, 2, 34, 34, 5)
print(t1, type(t1))

t2 = 'a', 'b', 'c'
print(t2, type(t2))

t3 = 'b',
t3_no = 'b'
t_int = (1)
print(t_int, type(t_int))  # <class 'int'>
print(t3_no, type(t3_no))  # <class 'str'>
print(t3, type(t3))  # <class 'tuple'>

print(8 * (8))  # 64
print(8 * (8,))  # (8, 8, 8, 8, 8, 8, 8, 8)

# ---> 当然也可以创建二维元组：
tp_2 = (12, 34, 544), (23,)
print('tp_2', tp_2)

"""
元组中可以用整数来对它进行索引 (indexing) 和切片 (slicing)，不严谨的讲，前者是获取单个元素，后者是获取一
组元素。接着上面二维元组的例子，先看看索引的代码。
"""
nested = (1, 10.23, 'python'), ('data', 11)
print('nested', nested)
print('nested[0]', nested[0])
print(nested[0][0], nested[0][1], nested[0][2], nested[0][2], )
# print(nested[0][5])  # error

# 切片
print(nested[0][1:10])

# @.更新和删除一个元组
update = ('1', '2', '3', '4')
update = update[:2] + ('middle',) + update[2:]
print(update)  # ('1', '2', 'middle', '3', '4')
# 元组有不可更改 (immutable) 的性质，因此不能直接给元组的元素赋值，但是只要元组中的元素可更改 (mutable)，那么我
# 们可以直接更改其元素，注意这跟赋值其元素不同。


# @.元组相关的操作符
"""
1. 比较操作符
2. 逻辑操作符
3. 连接操作符 +
4. 重复操作符 *
5. 成员关系操作符 in 、 not in
"""
tp3 = (1, 2, 3)
tp4 = ('a', 'b', 'c', 'a')
print('tp3 + tp4', tp3 + tp4)  # (1, 2, 3, 'a', 'b', 'c')
# @.内置方法

# 元组大小和内容都不可更改，因此只有 count 和 index 两种方法。

print("tp4.count('a')", tp4.count('a'))
# @.解压元组


# 解压（unpack）一维元组（有几个元素左边括号定义几个变量）
t = (1, 10.31, 'python')
(a, b, c) = t
print(a, b, c)  # 1 10.31 python

# 解压二维元组（按照元组里的元组结构来定义变量）
t = (1, 10.31, ('OK', 'python'))
(a, b, (c, d)) = t
print(a, b, c, d)  # 1 10.31 OK python

# 如果你只想要元组其中几个元素，用通配符「 * 」，英文叫wildcard，在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 rest 变量。

# 如果你根本不在乎 rest 变量，那么就用通配符「*」加上下划线「_」。


t = (1, 10.31, ('OK', 'python'), 'asd', 'end')
(x, y, *rs, c) = t
(x1, *_, end) = t
print('x1', x1)
print('end', end)

print('x', x)
print('y', y)
print('rs', rs)
print('c', c)

print((1, 2) * 2)
print((1,) * 2)
print('1' * 2, type('1' * 2))
